<?php
/**
 * Created by LíJimpéy(：
 * User: jimpey88
 * Date: 2024/3/28
 * Email: < jimpey@qq.com >
 * Project: company-admin-tp6
 */

namespace app\backend_api\services;

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use stdClass;

class JwtTokenService
{
    // 访问密钥
    const KEY = 'lVqO28XxPa56O5ro';
    // 签发者
    const ISS = 'jimpey88';
    // 接收者
    const AUD = 'www.ljp88.com';
    // 加密算法 The signing algorithm
    const ALG = 'HS256';

    /**
     * 生成token
     * @param $uid
     * @return mixed
     */
    public static function generateToken($uid)
    {
        //获取当前时间戳
        $currentTime = time();
        $data = [
            "iss" => self::ISS,        //签发者 可以为空
            "aud" => self::AUD,        //面象的用户，可以为空
            "iat" => $currentTime,   //签发时间
            "nbf" => $currentTime,   //立马生效
            "exp" => $currentTime + (int)env('jwt.exp'), //token 过期时间 两小时
            "data" => [              //记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
                'uid' => $uid,
            ],
        ];
        //生成token
        //根据参数生成了 token
        $token = JWT::encode($data, self::KEY, self::ALG);
        $expires_in = $data['exp'];
        return compact('token', 'expires_in');
    }

    /**
     * 校验token时效性
     */
    public static function checkToken($token): array
    {
        $status=array("code"=>2);
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($token, new Key(self::KEY,  self::ALG)); //HS256方式，这里要和签发的时候对应
            $arr = (array)$decoded;
            $res['code']=1;
            $res['data']=$arr['data'];
            return $res;
        } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            $status['msg']="签名不正确";
            return $status;
        }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $status['msg']="token失效";
            return $status;
        }catch(\Firebase\JWT\ExpiredException $e) { // token过期
            $status['msg']="token失效";
            return $status;
        }catch(\Exception $e) { //其他错误
            $status['msg']="未知错误";
            return $status;
        }
    }



}